20
תגובות
את העמודה של הזמן אצלי הגדרתי בDATETIME שזה בעצם DATE וTIME אבל שמתי לב שלרוב הוא לא מתייחס לצורה שבה אני מארגן את הSTRING של הDATE כלומר יש לו סדר מסוים כמו למשל שימוש ב"-" קבוע
אורך שנה מלא וכו'

מכאן הסקתי שהדרך היחידה לאחסן במסד DATETIME כזה:
("H:i:s d/m/Y")

היא רק באמצעות עמודה מסוג TEXT

האם ככה אני צריך לפעול + מה היתרונות בלעבוד עם DATETIME באופן כללי מאשר בTEXT..?

20 תשובות

avatar ענה משתמש_237402 ב 12 ליוני 2012 #

באופן כללי המסד בכלל שומר את הזמן בתור מספר של שניות מאז 1970.
הבעיה שלך זה מה שאתה רואה על המסך. ומה שקורה, זה ש mysql בדרך כלל באופן אוטומטי מתרגמת את המספר הזה לתצוגה טקסטואלית כמו זאת שאתה רואה.
אם אתה רוצה שהיא תתרגם את הזמן לתצוגה אחרת - עליך להישתמש בפונקציה date_format. (שים לב, שזה לא ישנה את הדרך שבה המסד שומר את הזמן, זה ישנה רק את הדרך שבה זה יוצג לך)

בשליפה עצמה תוכל לעשות משהו כזה:

select DATE_FORMAT(date_column, "%d/%m/%Y %k:%i:%s")
FROM table

ראה את כל האפשרויות של date_format כאן

היתרון של זה שאתה יכול לשלוף לפי תאריך, לעשות השוואות על העמודה (איפה שתאריך גדול מ),
להוסיף תנאים על העמודה הזו ו/או חישובים שלא יכולת לעשות על סתם שדה טקסט.
+ השמירה של השדה הזה הרבה יותר אפקטיבית מבחינת זיכרון :)

avatar ענה משתמש_225673 ב 12 ליוני 2012 #

איך אני משנה את המסד לפורמט קבוע כזה?
אמרת קובץ הגדרות אתה יכול להרחיב?

אני יכול אולי להגדיר את הפורמט של הDATE דרך המסד??
אולי בהגדרה של DEFAULT בעמודה של הDATETIME?

avatar ענה intval ב 12 ליוני 2012 #

אתה לא תוכל לעשות את זה באחסון מימלא. ככה שלרזותך עומדת הפונקציה date_format

avatar ענה משתמש_225673 ב 12 ליוני 2012 #

אני רוצה להגדיר את העמודה בפורמט כזה..
זה כמו לתת לה DEFAULT מסוים אני מאמין שחייב להיות
יש לי פורום שבניתי בסגנון "תפוז" ככה שהזמן מופיע מלא פעמים בדף או יותר נכון נשלף מלא פעמים
לא הגיוני כל פעם לעשות DATEFORMAT ועדיף כבר לעבור לTEXT..

ואם מדברים כבר על DATEFORMAT איך אני יכול לשלוף את הכל " * " וגם את DATEFORMAT מבלי לכתוב את כל העמודות?

avatar ענה intval ב 12 ליוני 2012 #

מצטער על ההתייה. אין דרך לעשות את זה לא במחשב שלך ולא באחסון.
האופציה היחידה שלך היא להישתמש ב date_format. אני לא מבין את הבעיה .

נכון שזה נראה מטומטם שהחליטו לעשות את זה ככה, אבל זה ממש לא כי
mysql שומרת את הזמן בתור מספר שניות. הם היו חייבים להחליט על איזשהו פורמט כלשהו לתצוגה טקסטואלית וזה הפורמט שנבחר. אם היו בוחרים את הפורמט שלך - היה מישהו בפורום אחר מתעצבן שזה לא מתאים לו.

ככה שבחרו פורמט כלשהו. אם אתה רוצה פורמט אחר - נתנו לרשותך את date_format
ודווקא זה מאוד הגיוני לעשות date_format. יותר מזה - זה בדיוק מה שמצפים שתעשה.

select *, date_format(...) from table

avatar ענה משתמש_225673 ב 12 ליוני 2012 #

אוקי הבנתי..

אבל בכל אופן מה יותר זריז ויעיל במקרה שלי TEXT או DATETIME
במקרה שלי הכוונה שאני משתמש בפורמט..

ובוא נגיד שאני משתמש בDATETIME
מה אני צריך להכניס לעמודה הזאת במסד DATE או TIME שניהם פעולת

avatar ענה intval ב 12 ליוני 2012 #

תשתמש ב datettime
כשאתה רוצה להכניס משהו לעמודה הזאת אתה יכול להכניס את NOW

insert into table (a,datefield,b) value ('a', NOW(), 'b')


את שאלת ה"אחסון זמן" מיצינו?
שאלות חדשות הייתי מעדיף בתור שאלות נפרדות. קשה לעקוב אחרי נושא עם 20 תגובות.
בנוסף יש בעיה באתר, כל האנשים עם החוש השישי יצאו לחופשת הקיץ ואם אתה לא כותב בדיוק את הקוד שניסיתי להפעיל ואת הודעת השגיאה שקיבלת - אין מי שיעזור לך.

avatar ענה משתמש_225673 ב 12 ליוני 2012 #

אהה סבבה..
תודה רבה!

avatar ענה משתמש_225673 ב 12 ליוני 2012 #

אבל לגבי הTIME איך אני בטוח שזה מכוון לירושליים ולאסיה

avatar ענה intval ב 12 ליוני 2012 #

SELECT @@global.time_zone, @@session.time_zone;

אם משהו מהם לא בסדר, תצטרך לשנות את זה בקובפ קונפיגורצה my.cfg
אם אין לך אפשרות לעשות את זה, למשל באחסון, אתה יכול אחרי החיבור למסד להפעיל את השאילת
set time_zone = '+02:00';

avatar ענה משתמש_225673 ב 12 ליוני 2012 #

זאת אומרת לכוון את זה..
אין הבדל הרי בין TIME בSQL לTIME בPHP נכון?
בPHP זה יותר פשוט כי אני פשוט שם לפני הTIME
TIMEZONE
כלומר לכוון את הTIME לזמן בישראל ופשוט אחרי זה להכניס אותו למסד..

avatar ענה intval ב 12 ליוני 2012 #

בטח שיש הבדלים.
מתוך ברירת מחדל שניהם משתמשים בשעה של השרת.
אבל אתה יכול להגדיר בכל אחת מהן גם שעה אחרת (למקרה שהשעה של השרת לא מוצאת חן בעיניך).
אם אתה מגדיר אותה רק ב php זה משפיע רק על php.
אם אתה מגדיר אותה רק ב mysql זה משפיע רק על mysql

avatar ענה itamarhadad ב 13 ליוני 2012 #

אז מה אני אמור להכניס לעמודה הזאת בPHP?

date_default_timezone_set("Asia/Jerusalem");
$time=time();

ואז את הִ$TIME להכניס לשרת??
(הTIME שכתבתי עכשיו מכוון לישראל??)

avatar ענה משתמש_238913 ב 13 ליוני 2012 #

אתה יכול לכוון את השעה של המנוע MySQL לשעה של המנוע PHP ככה:

date_default_timezone_set("Asia/Jerusalem");
$sqlQuery = sprintf("SET `time_zone` = '%s';", date("P"));

avatar ענה intval ב 13 ליוני 2012 #

תנסה ככה

avatar ענה itamarhadad ב 13 ליוני 2012 #

תקשיבו רגע השאילתה שלי זה זה:

INSERT INTO threads VALUES ('','$title','$user-id','$message','$date')

לפי מה שINTVAL אמר אני צריך לעשות ככה:
INSERT INTO threads VALUES ('','$title','$user-id','$message',NOW())

אבל אמרנו שהבעיה היא שזה שמסד לא מכוון
אז בעצם מה שאני אמור לעשות זה להריץ את הקוד PHP הזה פעם אחת בלבד כמו שהוא מבלי לשנות בו כלום?
date_default_timezone_set("Asia/Jerusalem");
$sqlQuery = sprintf("SET `time_zone` = '%s';", date("P"));
mysql_query($sqlQuery);

avatar ענה intval ב 13 ליוני 2012 #

נכון.
למרות שלא אמרנו שהמסד לא מכוון. אמרנו שהוא יכול להיות לא מכוון. ואם הוא לא מכוון - אז צריך לעשות את הפקודות האלה.

avatar ענה itamarhadad ב 14 ליוני 2012 #

אז אני מריץ את הקוד הזה ככה בדיוק רק עם תוספת של הסיסמא למסד והדאטבייס?

avatar ענה משתמש_238913 ב 14 ליוני 2012 #

כן, אני מעדיף להוסיף את השאילתא הזאת גם לקידוד.
זה נראה בערך ככה:

<?php
date_default_timezone_set('Asia/Tel_Aviv');

$_CONFIG = array
(
  // http://dev.mysql.com/doc/refman/5.5/en/charset-connection.html
  'mysql_encoding' => 'utf8',

  // http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html
  'time_zone' => date('P'),

  // http://dev.mysql.com/doc/refman/5.5/en/locale-support.html
  'lc_time_names' => 'he_IL',
);

mysql_query
("
  SET NAMES '{$_CONFIG['mysql_encoding']}',
      `time_zone` = '{$_CONFIG['mysql_time_zone']}',
        `lc_time_names` = '{$_CONFIG['mysql_locale']}';
"
)
or die(mysql_error());


--שים לב-- אם יש לך אפשרות לערוך את my.cfg - עדיף כך, זה יחסוך את השאילתא הזאת.

avatar ענה intval ב 14 ליוני 2012 #

@משתמש_238913
תודה על השיתוף.
הצחיק אותי לגלות שיש asia/jerusalem וגם asia/tel_aviv ברשימה של timezones